duplicated = true;
duplicationChecked = false;

(function($)
{
	$(document).ready(function()
	{
		$('.alert-success').hide();
		$('.alert-block').hide();
		
		$("#identityForm").validate(
		{
			rules :
			{
				name : "required",
				email :
				{
					email : true
				}
			},
			messages :
			{
				name : "이름을 입력해 주시기 바랍니다.",
				email : "이메일을 형식에 맞게 입력해 주시기 바랍니다."
			},
			highlight : function(label)
			{
				$(label).closest('.control-group').addClass('error');
			},
			success : function(label)
			{
				var message = "";
				
				switch(label.attr('for'))
				{
					case 'name' :
						
						message = "올바른 형식의 이름입니다.";
						
						break;
						
					case 'email' :
						
						message = "올바른 형식의 이메일입니다.";
						
						break;
				}
				
				label.text(message).addClass('valid').closest('.control-group').addClass('success');
			}
		});
		
		$('#checkDuplicationButton').unbind('click').click(checkDuplication);
		
		$('#backButton').unbind('click').click(getBack);
		
		$('input[name="securityId"]').unbind('change').change(securityIdValueChanged);
		
		$('.stdform').unbind('submit').submit(submitSave);
	});
	
	/**
	 * 계정 아이디 중복 검사를 서버로 요청한다.
	 * @param event 중복 검사 버튼의 클릭 이벤트 정보가 전달된다.
	 */
	function checkDuplication(event)
	{
		var securityId = jQuery('input[name="securityId"]').val();
		
		if (!securityId)
		{
			displayDuplicationCheck(false, '계정 아이디를 입력하신 뒤에 중복 검사를 하시기 바랍니다.');
			
			return false;
		}
		
		$.ajax(
		{
			url : '{0}/security/identity/find'.format(contextPath),
			type : 'post',
			cache : false,
			data : 
			{
				'securityId' : securityId
			},
			dataType : 'json',
			success : checkDuplicationCallback
		});
	}
	
	/**
	 * 계정 아이디 중복 검사 콜백이 실행된다.
	 * @param data 중복 검사 결과 정보가 전달된다.
	 */
	function checkDuplicationCallback(data)
	{
		duplicated = data.duplicated;
		duplicationChecked = !duplicated;
		
		switch (data.duplicated)
		{
			case true:
				
				displayDuplicationCheck(false, '이미 사용 중인 계정 아이디입니다.');
				
				break;
				
			case false:
				
				displayDuplicationCheck(true, '사용 가능한 계정 아이디입니다.');
				
				jQuery('#checkDuplicationButton').hide();
				
				break;
		}
	}
	
	/**
	 * 중복 검사 결과를 폼에 표시한다.
	 * @param isSuccess 중복 검사 성공 여부를 설정한다.
	 * @param message 중복 검사 결과에 대한 메시지를 설정한다.
	 */
	function displayDuplicationCheck(isSuccess, message)
	{
		var input = jQuery('input[name="securityId"]');
		
		input.parent().children('.error').remove();
		
		input.closest('.control-group').removeClass('success').removeClass('error').addClass(isSuccess ? 'success' : 'error');
		input.parent().append('<label class="{0}" for="securityId" generated="true">{1}</label>'.format(isSuccess ? 'error valid' : 'error', message));
	}

	/**
	 * 계정 아이디의 값이 변경됐을 때 발생하는 이벤트를 정의한다.
	 * @param event 계정 아이디 텍스트 박스의 Change 이벤트 정보가 전달된다.
	 */
	function securityIdValueChanged(event)
	{
		$('#checkDuplicationButton').show();
		
		var input = $('input[name="securityId"]');
		
		input.parent().children('.error').remove();
		input.closest('.control-group').removeClass('success').removeClass('error');
	}

	/**
	 * 유효성을 판단하고 보안 계정 정보를 저장하기 위해 서버로 요청한다.
	 * @param event 폼 Submit 이벤트 정보가 전달된다.
	 * @returns {Boolean} 중복 검사를 실행하지 않았거나 사용 중인 계정 아이디가 입력된 경우 false가 반환된다.
	 */
	function submitSave(event)
	{
		if (!duplicationChecked)
		{
			displayDuplicationCheck(false, '계정 아이디 중복 검사를 실행해 주세요.');
			
			return false;
		}
		
		if (duplicated)
		{
			displayDuplicationCheck(false, '이미 사용 중인 계정 아이디입니다.');
			
			return false;
		}
		
		$('#submitButton').attr('disabled', true);
		
		$.ajax(
		{
			url : '{0}/security/identity/save'.format(contextPath),
			type : 'post',
			cache : false,
			data : jQuery(this).serialize(),
			dataType : 'json',
			success : saveIdentityCallback
		});
		
		return false;
	}

	/**
	 * 보안 계정 정보 저장 콜백이 실행된다.
	 * @param data 보안 계정 정보 저장 결과가 전달된다.
	 */
	function saveIdentityCallback(data)
	{
		switch (data.result)
		{
			case true:
				
				$('#identityId').val(data.securityIdentity.identityId);
				
				$('.control-group').removeClass('success').removeClass('error');
				$('input[name="securityId"]').parent().children('.error').remove();
				
				$('.alert-success').fadeIn(2000, function() { $('.alert-success').fadeOut(3500); });
				
				break;
				
			case false:
				
				$('.alert-block').children('p').text(data.errorMessage);
				$('.alert-block').fadeIn(2000, function() { $('.alert-block').fadeOut(3500); });
				
				break;
		}
		
		$('#submitButton').removeAttr('disabled');
	}

	/**
	 * 목록 페이지로 이동한다.
	 * @param event 버튼 클릭 이벤트 정보가 전달된다.
	 */
	function getBack(event)
	{
		$('#form').submit();
	}
})(jQuery);